<?php

/* 
 * 对网站的所有请求连接都具有如下的形式：
 *  http://www.huakaili.com/index.php?page=(pagename)&para1=p1&...
 *  其中page参数就是指向的请求的页面，可以使用url rewrite来使连接更加清洁和整齐
 */


/*
 *	
 *  统一文件级别的缓冲区控制，如果需要的话，比如memcache或者APC
 *
 *  echo apc_fetch( $this->page );
 *	exit(1);
 */

//ini_set( 'display_errors', 'on');
//error_reporting( E_ERROR );

header("Content-Type:text/html;charset=UTF-8");
$page_base = $_REQUEST['page'];
$pageVars = array();



if( !isset($page_base) )
    $page_base = "index";

// prevent attack to the including file
// all target page name includes only 0-9,a-z,A-Z and underscore.
if( preg_match( "/[^A-Za-z0-9_]+/", $page_base ) != 0 )
	$page_base = "page_not_found";


/**********************************************************
 *
 * >> Attention! <<
 * Tiny page means that this page is composed of two parts:
 * the module part and the page body. But the page body do
 * no have regular footer and header. This tiny page is very
 * useful when we generate graphics to the browser or deal
 * with ajax operations in which we just send back some date
 * without any styles.
 * 
 **********************************************************/    
    
if( isset($_REQUEST['tiny']) )
	$tiny_page = $_REQUEST['tiny'];
    

// 装载所有需要的配置文件，比如数据库连接、通用函数等
require( 'config/loadconfig.php' );

// use IP to do access limit control
if(extension_loaded('oss_base')) 
{
	if( !AccessLimit() ){
	      echo "server busy... please try again later";
              return;
        }	
}


// Authentication for pages
//ImpersonateUser( "3", "seal1", true );
//ImpersonateUser( "4", "seal2", true );
UserAuthentication();

$page_validate = ValidatePageInput( $page_base );

/* 
 * 装载所有的单独页面需要的数据模块，这里的模块等于就是MVC中的controller，在这里负责进行一些赋值，权限判断和跳转等。
 * 名称和页面名称相同，如果没有，就不加载
 */
$transfer = null;
if(LoadDataModule( $page_base ) != '' )
	require_once( LoadDataModule( $page_base ) );
	
/* 
 * html_header是所有页面的<header>部分，之所以要统一控制，是为了方便CSS文件的载入以及对其他信息的
 * 统一修改，比如编码，Meta关键字等等。这里采用了重载的机制，如果各个页面没有自己的header文件，那么就
 * 使用同一的header文件 tpl/common/html_header.php，如果各个页面提供了自己特殊的header文件，那么就使用自己
 * 的header文件，tpl/[page_base]/html_header.php
 * 
 * CSS和JS的文件装载也采用重载机制，这样有利于css文件和JS文件的分开和体制控制，这里是JS文件的示范
 * 首先装载所有页面都需要的共同的JS文件
 * require_once( "common.js" )
 * 然后是装载被请求页面所需要的单独的JS文件，这些文件的前缀都是页面名称，后缀可以是不同的，因为可能有多个
 * 比如 main_1.js, main_2.js，都属于main页面的js文件，css文件的命名规则也相同
 *
 * 
 */
	
if( isset($tiny_page) && !is_null($tiny_page) )
{
	$tbody = LoadTinyPageBody( $page_base );
	if( $tbody != "" )
		require_once( $tbody );
}
else 
{
	require_once( LoadHtmlHeader( $page_base ) );

	/* 
	 * 装载页面的整体框架，这里的框架是指页面内容和布局。考虑到页面之间的共性和个性，这里也采用重载的机制，
	 * 如果页面没有自己的框架文件，那么就是用 tpl/common/layout.php 来构架，这个框架文件采用典型的三部页
	 * 面模式，页眉，中间内容和页脚部分，但是如果页面有自己特殊的整体布局，那么就采用页面自己的整体布局文件，
	 * tpl/[page_base]/layout.php
	 *
	 */
	require_once( LoadPageLayout( $page_base ) );
}


/**
 * End of the page, do the clean up
 */
 require_once ("config/unloadconfig.php");


function ip_address_to_number($IPaddress) {
        if (!$IPaddress) {
            return false;
        } else {
	    return sprintf("%u", ip2long($IPaddress));
	}
}

function AccessLimit() {
	$limitSource = ip_address_to_number( $_SERVER["REMOTE_ADDR"] ); 
	
	// user acess limit
	$access_limit_file_user = './logs/huakaili_user_access_limit.dat';
	$res = local_access_limit( $access_limit_file_user, $limitSource,
	1, 2 );
				
	if( $res!=0 )
	{
		return false;
	}
       
	//server access limit
	$access_limit_file_server = './logs/huakaili_server_access_limit.dat';
	$res = local_access_limit( $access_limit_file_server, 0,
		1,10 );
       
	if( $res!=0 )
	{
		return false;
	}
       
	return true;
}
 
?>
